﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace OWLServer.owl.tipos
{
    /// <summary>
    /// Clase que representa un elemento en una ontología.
    /// </summary>
    public class Elemento : IEquatable<Object>
    {
        private int idBBDD;
        private string id;
        private EspacioNombres espacioNombres;
        private XElement elementoOWL;

        /// <summary>
        /// Id con el que se almacena en la Base de Datos
        /// </summary>
        public virtual int IdBBDD
        {
            get { return idBBDD; }
            set { idBBDD = value; }
        }

        /// <summary>
        /// Id o About del elemento
        /// </summary>
        public virtual string Id
        {
            get { return id; }
            set { id = value; }
        }

        /// <summary>
        /// Espacio de nombres al que pertenece
        /// </summary>
        public virtual EspacioNombres EspacioNombres
        {
            get { return espacioNombres; }
            set { espacioNombres = value; }
        }

        /// <summary>
        /// Elemento del OWL que representa a este elemento
        /// </summary>
        public virtual XElement ElementoOWL
        {
            get { return elementoOWL; }
            set { elementoOWL = value; }
        }

        public Elemento() { }

        public Elemento(string id)
        {
            this.id = id;
        }

        public Elemento(string id, EspacioNombres espacioNombres)
        {
            Id = id;
            EspacioNombres = espacioNombres;
        }

        public Elemento(Elemento elemento)
        {
            id = elemento.Id;
            espacioNombres = elemento.espacioNombres;
        }

        override public String ToString()
        {
            return Id + "__" + (EspacioNombres != null ? EspacioNombres.ToString() : "");
        }

        #region Miembros de IEquatable<Clase>

        override public bool Equals(Object other)
        {
            bool igual = false;

            if (other is Elemento)
            {
                Elemento otro = other as Elemento;
                igual = (Id == otro.Id) && (this.EspacioNombres.Equals(otro.EspacioNombres));
            }

            return igual;
        }

        #endregion
    }
}
